10. 国际化

通过潜在支持Spring MVC国际化标准,Grails支持国际化标准(i18n)开箱即用。在Grails中,你能够根据用户属地定制该地区语言的文字。引用Java语言中的 Locale 文档定义:
Locale 对象描述了特定的地理、政治和文化地区。需要 Locale来执行其任务的操作称为本地化操作,它使用 Locale为用户量身定制信息。例如,显示一个数值就是本地化操作,应该根据用户本国家、地区或文化的风俗/传统来格式化该数值。

一个Locale对象由language codecountry code组成。比如,en_US是美国英语的代码,而en_GB是英国英语的代码。

10.1 理解消息绑定

现 在你知道了本地化,为了在Grails中使用它们,你不得不创建你想显示的不同语言信息资源。Grails中的信息资源以简单的java属性文件格式放置 在grails-app/i18n目录下。

每个资源束根据规则,以messages名字开始和locale结束。Grails在grails-app/i18n下发布了一串不同语言范围内的内置信息,例如:

messages.properties 
messages_de.properties
messages_es.properties
etc.

默 认情况Grails会在messages.properties文件中检索信息,除非用户已经指定了一个自定义本地化文件。通过创建一个新的以 locale标签结尾的属性文件,你可以创建你感兴趣的属于自己的信息资源。比如属于英式英语范畴的 messages_en_GB.properties。

10.2 修改本地化

默认情况用户地区从传进来的 Accept-Language头部得知。然而 通过简单得给Grails传进lang参数作为请求参数,用户就可以更改地区了:
/book/list?lang=es

Grails 会自动更改用户地区,并把这个值存放在cookie里,随后的各种请求会有个新的头部。

10.3 读取信息

视图中读取信息

你 通常最需要信息的地方是在视图内。要在视图内读取信息,使用message标签就可以了,如下:

<g:message code="my.localized.content" />

只要你在带有合适locale后缀的messages.properties文件有个key键,比如下面这种格式,Grails就会找到相对应的信息:

my.localized.content=Hola, Me llamo John. Hoy es domingo.

注 意有时候你需要向相应的信息传递参数。参考下面这个message标签:

<g:message code="my.localized.content" args="${ ['Juan', 'lunes'] }" />

还有可能在信息中使用定位参数:

my.localized.content=Hola, Me llamo {0}. Hoy es {1}.

控制器和标签库中读取信息

因 为你可以在controllers中像方法一样使用标签,所以在controllers中读取信息也很经常,如下:

def show = { 
def msg = message(code:"my.localized.content", args:['Juan', 'lunes'])
}

tag libraries中使用的方法一样,但是注意如果你的标签库使用了不同的namespace,你需要使用g.前缀:

def myTag = { attrs, body -> 
def msg = g.message(code:"my.localized.content", args:['Juan', 'lunes'])
}

10.4 脚手架和i18n

Grails 没有发布可以生成控制器和视图的i18n特性脚手架模板。然而i18n模板插件可以提供i18n特性脚手架模板,这些模板与默认的脚手架模板一样,除了它 们为标签,按钮等定义信息时使用message标签外。

首先用下面的这个命令安装i18n模板:

grails install-plugin i18n-templates

参考reference on the wiki,它里面了解释怎么使用i18n模板。